// step 1# 自定义比较函数：按气球的起点x_start升序排列
int cmp(const void *a, const void *b)
{
    return ((*((int**)a))[0] > (*((int**)b))[0]);
}

// step 2# 主函数：最少需要多少箭可以射爆所有气球
int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
    // step 2.1# 对气球数组按起点x_start升序排序
    qsort(points, pointsSize, sizeof(points[0]), cmp);
    
    // step 2.2# 初始化箭的数量至少为1支（至少需要一支箭）
    int arrowNum = 1;
    
    // step 2.3# 遍历每一个气球
    for(int i = 1; i < pointsSize; i++) {
        // step 2.3.1# 如果当前气球的起点 > 上一个气球的终点，说明不重叠，需要多射一箭
        if(points[i][0] > points[i-1][1])
            arrowNum++;
        else
            // step 2.3.2# 如果重叠，更新当前气球的终点为较小的终点
            // 保证重叠区间最小化，以便下一次判断
            points[i][1] = points[i][1] > points[i-1][1] ? points[i-1][1] : points[i][1];
    }
    
    // step 2.4# 返回所需最少箭数
    return arrowNum;
}
